home *** CD-ROM | disk | FTP | other *** search
- /* This is file SCREEN.S */
- /*
- ** Copyright (C) 1993 DJ Delorie, 24 Kirsten Ave, Rochester NH 03867-2954
- **
- ** This file is distributed under the terms listed in the document
- ** "copying.dj", available from DJ Delorie at the address above.
- ** A copy of "copying.dj" should accompany this file; if not, a copy
- ** should be available from where this file was obtained. This file
- ** may not be distributed without a verbatim copy of "copying.dj".
- **
- ** This file is distributed WITHOUT ANY WARRANTY; without even the implied
- ** warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- **
- ** Modified by J. Alan Eldridge, Liberty Brokerage, 77 Water St, NYC 10005
- **
- ** added global char ScreenAttrib -- this is the attribute
- ** used by ScreenClear(): it defaults to 0x07 so as not to
- ** break existing code.
- **
- ** Modified by C. Sandmann (sandmann@clio.rice.edu) for DPMI support
- ** Combined SCREEN2.S and SCREEN.C into SCREEN.S
- */
-
- .data
-
- .globl _ScreenAttrib
- _ScreenAttrib:
- .byte 0x07
-
- .text
-
- .align 2
- .globl _ScreenSetCursor
- /* row, col */
- _ScreenSetCursor:
- pushl %ebp
- movl %esp,%ebp
- pushl %ebx
- pushl %esi
- pushl %edi
- movb $0x02,%ah
- movb $0,%bh
- movb 8(%ebp),%dh
- movb 12(%ebp),%dl
- int $0x10
- popl %edi
- popl %esi
- popl %ebx
- popl %ebp
- ret
-
- .align 2
- .globl _ScreenGetCursor
- /* &row, &col */
- _ScreenGetCursor:
- pushl %ebp
- movl %esp,%ebp
- pushl %ebx
- pushl %esi
- pushl %edi
- movb $0x03,%ah
- movb $0,%bh
- pushl %ebp
- int $0x10
- popl %ebp
- movl 8(%ebp),%esi
- movzbl %dh,%eax
- movl %eax,(%esi)
- movl 12(%ebp),%esi
- movzbl %dl,%eax
- movl %eax,(%esi)
- popl %edi
- popl %esi
- popl %ebx
- popl %ebp
- ret
-
- .align 2
- .globl _ScreenClear
- _ScreenClear:
- pushl %edi
- call _ScreenCols
- movl %eax,%ecx
- call _ScreenRows
- /* ECX is total words to store */
- imull %eax,%ecx
- movl _ScreenPrimary,%eax
- call dosmemsetup
- movl %eax,%edi
- push %es
- push %gs
- pop %es
- movb $0x20,%al
- movb _ScreenAttrib,%ah
- rep
- stosw
- pop %es
- popl %edi
- ret
-
- .align 2
- .globl _ScreenRows
- _ScreenRows:
- movl $0x484,%eax
- call dosmemsetup
- movzbl %gs:(%eax),%eax
- incl %eax
- ret
-
- .align 2
- .globl _ScreenCols
- _ScreenCols:
- movl $0x44a,%eax
- call dosmemsetup
- movzwl %gs:(%eax),%eax
- ret
-
- .align 2
- .globl _ScreenMode
- _ScreenMode:
- movl $0x449,%eax
- call dosmemsetup
- movzbl %gs:(%eax),%eax
- ret
-
- .align 2
- .globl _ScreenPutChar
- _ScreenPutChar:
- /* int ch, int attr, unsigned x, unsigned y */
- /*
- if ( (x >= ScreenCols()) || (y >= ScreenRows())) return;
- ch &= 0xff;
- attr = (attr & 0xff) << 8;
- *(unsigned short *)(ScreenPrimary+x+y*ScreenCols()) = ch | attr;
- */
- call _ScreenRows
- cmpl %eax,16(%esp)
- jae L1
- call _ScreenCols
- cmpl %eax,12(%esp)
- jae L1
- /* Out of range */
- movl %eax,%edx
- imull 16(%esp),%edx
- addl 12(%esp),%edx
- /* EDX = x + y*ScreenCols */
-
- movb 4(%esp),%cl
- movb 8(%esp),%ch
-
- movl _ScreenPrimary,%eax
- call dosmemsetup
- movw %cx,%gs:(%eax,%edx,2)
- L1:
- ret
-
- /* A quick way to update the screen from a logical video buffer, used
- primarily for DPMI full screen management */
- .align 2
- .globl _ScreenUpdate
- /* (void *)screenbuf */
- _ScreenUpdate:
- call _ScreenRows
- movl %eax,%ecx
- call _ScreenCols
- imull %eax,%ecx
- sarl $1,%ecx
- /* Number of long words in screen */
-
- movl _ScreenPrimary,%eax
- call dosmemsetup
- movl 4(%esp),%edx
- /* screenbuf */
-
- pushl %esi
- pushl %edi
- movl %eax,%edi
- movl %edx,%esi
- push %es
- push %gs
- pop %es
- rep
- movsl
- /* move ECX bytes to Real area */
- pop %es
- popl %edi
- popl %esi
- ret
-
- /* A quick way to update a screen line from a logical video buffer, used
- primarily for DPMI full screen management */
- .align 2
- .globl _ScreenUpdateLine
- /* (void *)screenline, int row */
- _ScreenUpdateLine:
- call _ScreenCols
- movl %eax,%ecx
- sarl $1,%ecx
- /* Number of long words in screen line */
- shll $1,%eax
- imull 8(%esp),%eax
- addl _ScreenPrimary,%eax
- call dosmemsetup
- movl 4(%esp),%edx
- /* screenbuf */
-
- pushl %esi
- pushl %edi
- movl %eax,%edi
- movl %edx,%esi
- push %es
- push %gs
- pop %es
- rep
- movsl
- /* move ECX bytes to Real area */
- pop %es
- popl %edi
- popl %esi
- ret
-
-
- /* A quick way to update the screen from a logical video buffer, used
- primarily for DPMI full screen management */
- .align 2
- .globl _ScreenRetrieve
- /* (void *)screenbuf */
- _ScreenRetrieve:
- call _ScreenRows
- movl %eax,%ecx
- call _ScreenCols
- imull %eax,%ecx
- sarl $1,%ecx
- /* Number of long words in screen */
-
- movl _ScreenPrimary,%eax
- call dosmemsetup
- movl 4(%esp),%edx
- /* screenbuf */
-
- pushl %esi
- pushl %edi
- movl %eax,%esi
- movl %edx,%edi
- push %ds
- push %gs
- pop %ds
- rep
- movsl
- /* move ECX bytes to Real area */
- pop %ds
- popl %edi
- popl %esi
- ret
-
-